# created by Wu Bolun
# 2020.9.28
# bowenwu@sjtu.edu.cn

# constants

JMP_OPCODES = ['jmp']

CJMP_OPCODES = [
    'ja', 'jb', 'jbe', 'jcxz', 'jecxz', 'jg', 'jge',
    'jl', 'jle', 'jnb', 'jno', 'jnp', 'jns', 'jnz',
    'jo', 'jp', 'js', 'jz',
    'loop', 'loope', 'loopne', 'loopw',
    'loopwe', 'loopwne',
]

END_OPCODES = [
    'end',
    'iret', 'iretw',
    'retf', 'reti', 'retfw', 'retn', 'retnw',
    'sysexit', 'sysret',
    'xabort',
]

PSEUDO_OPCODES = [
    'dd', 'db', 'dw', 'dq', 'dt',
    'align', 'unicode', 'offset', 'stru', 'ends', 'extrn'
]

PSEUDO_OPERANDS = [
    'dd', 'db', 'dw', 'dq', 'dt',
    'align', 'unicode', 'stru', 'ends', 'extrn'
]

CODESEG_NAMES = [
    '.text:', 'CODE:', '.Much:', '.tixt:', 'UPX1:',
    '.icode:', '.IqR:', 'yogmamm:', '.brick:', 'iuagwws:',
    '.UfPOkc:', 'seg001:', 'ecasws:', '.unpack:','sect_1:', 
    'seg000:', '.edata:', '.aspack:', '.data:', '_____u1:',
    'qmoyiu:', 'acggagg:', '.u:', '.none:', 'dfd:', '.idata:',
]


# Ref: MAGIC
DataInstList = [
    'dd', 'db', 'dw', 'dq', 'dt','extrn', 'unicode'
]

CallingInstList = [
    'call', 'int', 'into', 'syscall', 'sysenter'
]

ConditionalJumpInstList = [
    'ja', 'jb', 'jbe', 'jcxz', 'jecxz', 'jg', 'jge',
    'jl', 'jle', 'jnb', 'jno', 'jnp', 'jns', 'jnz',
    'jo', 'jp', 'js', 'jz',
    'loop', 'loope', 'loopne', 'loopw',
    'loopwe', 'loopwne'
]

UnconditionalJumpInstList = ['jmp']

EndHereInstList = [
    'end', 'iret', 'iretw', 'retf', 'reti', 'retfw', 
    'retn', 'retnw', 'sysexit', 'sysret', 'xabort',
]

RepeatInstList = ['rep', 'repe', 'repne']

RegularInstList = [
    'aaa', 'aad', 'aam', 'aas', 'adc', 'add', 'addpd',
    'addps', 'addsd', 'addss', 'addsubpd', 'addsubps',
    'align', 'and', 'andnpd', 'andnps', 'andpd',
    'andps', 'arpl',
    'addr',
    'bound', 'bsf', 'bsr', 'bswap', 'bt', 'btc',
    'btr', 'bts',
    'cbw', 'cdq', 'clc', 'cld', 'clflush', 'cli', 'clts',
    'cmc', 'cmova', 'cmovb', 'cmovbe', 'cmovg', 'cmovge',
    'cmovl', 'cmovle', 'cmovnb', 'cmovno', 'cmovnp',
    'cmovns', 'cmovnz', 'cmovo', 'cmovp', 'cmovs', 'cmovz',
    'cmp', 'cmpeqps', 'cmpeqsd', 'cmpeqss', 'cmpleps',
    'cmplesd', 'cmpltpd', 'cmpltps', 'cmpltsd', 'cmpneqpd',
    'cmpneqps', 'cmpnlepd', 'cmpnlesd', 'cmpps', 'cmps',
    'cmpeqpd', 'cmpltss', 'cmpnleps', 'cmpnless', 'cmpnltpd',
    'cmpnltps', 'cmpnltsd', 'cmpnltss', 'cmpunordpd', 'cmpunordps',
    'cmpsb', 'cmpsd', 'cmpsw', 'cmpxchg', 'comisd',
    'comiss', 'cpuid', 'cwd', 'cwde',
    'daa', 'das', 'dec', 'div', 'divps', 'divsd', 'divss',
    'divpd',
    'emms', 'enter', 'enterw', 'extractps',
    'fabs', 'fadd', 'faddp', 'fbld', 'fbstp', 'fchs',
    'fclex', 'fcmovb', 'fcmovbe', 'fcmove', 'fcmovnb',
    'fcmovnbe', 'fcmovne', 'fcmovnu', 'fcmovu', 'fcom',
    'fcomi', 'fcomip', 'fcomp', 'fcompp', 'fcos',
    'fdecstp', 'fdiv', 'fdivp',
    'finit', 'fxrstor',
    'fdivr', 'fdivrp', 'femms', 'ffree', 'ffreep', 'fiadd',
    'ficom', 'ficomp', 'fidiv', 'fidivr', 'fild', 'fimul',
    'fincstp', 'fist', 'fistp', 'fisttp', 'fisub', 'fisubr',
    'fld', 'fldcw', 'fldenv', 'fldpi', 'fldz', 'fmul',
    'fmulp', 'fnclex', 'fndisi', 'fneni', 'fninit', 'fnop',
    'fnsave', 'fnstcw', 'fnstenv', 'fnstsw', 'fpatan',
    'fprem', 'fptan', 'frndint', 'frstor', 'fsave',
    'fscale', 'fsetpm', 'fsin', 'fsincos', 'fsqrt', 'fst',
    'fstcw', 'fstenv', 'fstp', 'fstsw', 'fsub', 'fsubp',
    'fsubr', 'fsubrp', 'ftst', 'fucom', 'fucomi',
    'fucomip', 'fucomp', 'fucompp', 'fxam', 'fxch',
    'fxsave', 'fxtract',
    'getsec',
    'hlt', 'hnt', 'ht',
    'hcur', 'hdc', 'hwinsta', 'hwnd',
    'icebp', 'idiv', 'imul', 'in', 'inc', 'ins', 'insb',
    'insd', 'insertps', 'insw', 'invd',
    'lahf', 'lar', 'lddqu', 'ldmxcsr', 'lds', 'lea',
    'leave', 'leavew', 'les', 'lfence', 'lfs', 'lgdt',
    'lgs', 'lidt', 'lldt', 'lock', 'lods', 'lodsb',
    'lodsd', 'lodsw', 'lsl', 'lss',
    'lmsw', 'ltr',
    'maskmovq', 'maxps', 'maxss', 'minps', 'minsd', 'minss',
    'mov', 'movapd', 'movaps', 'movd', 'movdqa', 'movdqu',
    'movhlps', 'movhpd', 'movhps', 'movlhps', 'movlpd',
    'movlps', 'movmskpd', 'movmskps', 'movntdq', 'movnti',
    'movntps', 'movntq', 'movq', 'movs', 'movsb', 'movsd',
    'movss', 'movsw', 'movsx', 'movups', 'movzx', 'mpsadbw',
    'mul', 'mulpd', 'mulps', 'mulsd', 'mulss',
    'maxpd', 'maxsd', 'minpd', 'movntpd', 'movupd',
    'neg', 'nop', 'not',
    'nomem',
    'or', 'orpd', 'orps', 'out', 'outs',
    'outsb', 'outsd', 'outsw',
    'pabsw', 'packssdw', 'packsswb', 'packusdw',
    'packuswb', 'paddb', 'paddd', 'paddq', 'paddsb',
    'paddsw', 'paddusb', 'paddusw', 'paddw', 'palignr',
    'pand', 'pandn', 'pause', 'pavgb', 'pavgusb', 'pavgw',
    'pblendvb', 'pcmpeqb', 'pcmpeqd', 'pcmpeqw', 'pcmpgtb',
    'pcmpgtd', 'pcmpgtw', 'pextrb', 'pextrd', 'pextrw',
    'pfacc', 'pfadd', 'pfcmpeq', 'pfcmpge', 'pfcmpgt',
    'pfmax', 'pfmin', 'pfmul', 'pfnacc', 'pfpnacc',
    'pfrcp', 'pfrsqrt', 'pfsub', 'pfsubr', 'phaddd',
    'phaddw', 'phminposuw', 'phsubd', 'pinsrd',
    'pinsrw', 'pmaddubsw', 'pmaddwd', 'pmaxsw', 'pmaxub',
    'pminsw', 'pminub', 'pminud', 'pminuw', 'pmovmskb',
    'pmovzxbd', 'pmovzxwd', 'pmulhrsw', 'pmulhuw', 'pmulhw',
    'pmullw', 'pmuludq', 'pop', 'popa', 'popaw', 'popf',
    'popfw', 'por', 'pqit', 'prefetch', 'prefetchnta',
    'prefetchw', 'psadbw', 'pshufb', 'pshufd', 'pshufhw',
    'pshuflw', 'pshufw', 'psignw', 'pslld', 'pslldq',
    'psllq', 'psllw', 'psrad', 'psraw', 'psrld', 'psrldq',
    'psrlq', 'psrlw', 'psubb', 'psubd', 'psubq', 'psubsb',
    'psubsw', 'psubusb', 'psubusw', 'psubw', 'pswapd',
    'ptest', 'punpckhbw', 'punpckhdq', 'punpckhqdq',
    'punpckhwd', 'punpcklbw', 'punpckldq', 'punpcklqdq',
    'punpcklwd', 'push', 'pusha', 'pushaw',
    'pushf', 'pushfw', 'pxor',
    'pclsid', 'pmmt', 'pt', 'pvarg',
    'rc', 'rcl', 'rcpps', 'rcpss', 'rcr', 'rdmsr', 'rdpmc',
    'rdrand', 'rdtsc', 'rol', 'ror', 'roundps', 'rsldt',
    'rsm', 'rsqrtps', 'rsqrtss', 'rsts',
    'rclsid', 'rdseed', 'rguid', 'roundsd',
    'sahf', 'sal', 'sar', 'sbb', 'scas', 'scasb', 'scasd',
    'scasw', 'setalc', 'setb', 'setbe', 'setl', 'setle',
    'setnb', 'setnbe', 'setnl', 'setnle', 'setno', 'setnp',
    'setns', 'setnz', 'seto', 'setp', 'sets', 'setz',
    'sfence', 'sgdt', 'shl', 'shld', 'shr', 'shrd',
    'shufpd', 'shufps', 'sidt', 'sldt', 'sqrtps',
    'sqrtsd', 'sqrtss', 'stc', 'std', 'sti',
    'stmxcsr', 'stos', 'stosb', 'stosd',
    'stosw', 'str', 'sub', 'subpd', 'subps', 'subsd',
    'subss', 'svldt', 'svts',
    'smsw', 'sqrtpd', 'start', 'startinfo', 'sz',
    'test',
    'timeout',
    'ucomisd', 'ucomiss', 'unpckhpd', 'unpckhps',
    'unpcklpd', 'unpcklps',
    'vaddps', 'vaddsd', 'vaddss', 'vaddsubpd', 'vandnpd',
    'vcmppd', 'vcmpps', 'vcmpss', 'vcomisd', 'vdivpd',
    'vdivps', 'vdivsd', 'vdivss', 'verw', 'vhsubpd',
    'vhsubps', 'vmaxpd', 'vmaxsd', 'vmaxss', 'vminsd',
    'vminss', 'vmload', 'vmovapd', 'vmovaps', 'vmovd',
    'vmovddup', 'vmovdqa', 'vmovdqu', 'vmovhps', 'vmovlhps',
    'vmovntdq', 'vmovntpd', 'vmovntps', 'vmovntsd',
    'vmovsd', 'vmovsldup', 'vmovss', 'vmovupd', 'vmovups',
    'vmptrld', 'vmptrst', 'vmread', 'vmulps', 'vmulss',
    'vmwrite', 'vorpd', 'vpackssdw', 'vpacksswb',
    'vpackuswb', 'vpaddb', 'vpaddd', 'vpaddq',
    'vpaddsb', 'vpaddsw',
    'vpaddusb', 'vpaddusw', 'vpaddw', 'vpandn', 'vpcext',
    'vpclmulqdq', 'vpcmpeqb', 'vpcmpeqd',
    'vpcmpeqw', 'vpcmpgtb', 'vpcmpgtd', 'vpcmpgtw',
    'vpermilps', 'vpermq',
    'vpextrw', 'vpinsrw', 'vpmaddwd', 'vpmaxub', 'vpmulhuw',
    'vpmulhw', 'vpmullw', 'vpsadbw', 'vpshufhw', 'vpshuflw',
    'vpsllq', 'vpsllw', 'vpsrad', 'vpsrld', 'vpsrlq',
    'vpsrlw', 'vpsubb', 'vpsubd', 'vpsubusb', 'vpunpckhbw',
    'vpunpckhdq', 'vpunpckhqdq', 'vpunpckhwd', 'vpunpcklbw',
    'vpunpckldq', 'vpunpcklqdq', 'vpunpcklwd', 'vpxor',
    'vrcpss', 'vrsqrtss', 'vshufpd', 'vshufps', 'vsqrtpd',
    'vsqrtps', 'vsqrtsd', 'vsubpd', 'vsubps', 'vsubsd',
    'vucomiss', 'vunpckhps', 'vunpcklpd', 'vunpcklps',
    'vxorps', 'vzeroupper',
    'vaddpd', 'vaddsubps', 'vandnps', 'vandpd', 'vcmpsd',
    'vcomiss', 'verr', 'vlddqu', 'vmaxps', 'vminpd',
    'vmlaunch', 'vmmcall', 'vmovhlps', 'vmovlps', 'vmovq',
    'vmovshdup', 'vmulpd', 'vmulsd', 'vorps', 'vpavgw',
    'vpgatherqd', 'vpmaxuw', 'vpminsw', 'vpmuludq',
    'vpshufd','vpslld', 'vpsubsb', 'vpsubusw', 'vpsubw',
    'vrcpps', 'vrsqrtps', 'vucomisd', 'vunpckhpd',
    'wait', 'wbinvd', 'wrmsr',
    'xadd', 'xbegin', 'xchg', 'xlat', 'xor',
    'xorpd', 'xorps', 'xrstor', 'xsaveopt',
    'xsave', 'xsavec',
]

MathInstList = [
    'aaa', 'aad', 'aam', 'aas', 'adc', 'add', 'addpd',
    'addps', 'addsd', 'addss', 'addsubpd', 'addsubps',
    'daa', 'das', 'dec', 'div', 'divps', 'divsd', 'divss',
    'divpd',
    'fabs', 'fadd', 'faddp', 'fchs', 'fcos',
    'fdiv', 'fdivp',
    'fdivr', 'fdivrp', 'fiadd',
    'fidiv', 'fidivr', 'fimul', 'fisub', 'fisubr',
    'fmul', 'fmulp',  'fpatan',
    'fprem', 'fptan', 'frndint',
    'fscale', 'fsin', 'fsincos', 'fsqrt',
    'fsub', 'fsubp',
    'fsubr', 'fsubrp',  'fxam', 'fxch',
    'idiv', 'imul', 'inc',
    'maxps', 'maxss', 'minps', 'minsd', 'minss',
    'mul', 'mulpd', 'mulps', 'mulsd', 'mulss',
    'maxpd', 'maxsd', 'minpd',
    'neg',
    'pabsw',
    'paddb', 'paddd', 'paddq', 'paddsb',
    'paddsw', 'paddusb', 'paddusw', 'paddw',
    'pand', 'pandn', 'pavgb', 'pavgusb', 'pavgw',
    'pfacc', 'pfadd',
    'pfmax', 'pfmin', 'pfmul', 'pfnacc',
    'pfrcp', 'pfrsqrt', 'pfsub', 'pfsubr', 'phaddd',
    'phaddw', 'phminposuw', 'phsubd',
    'pmaddubsw', 'pmaddwd', 'pmaxsw', 'pmaxub',
    'pminsw', 'pminub', 'pminud', 'pminuw',  'pmulhrsw', 'pmulhuw', 'pmulhw',
    'pmullw', 'pmuludq', 'por',
    'psadbw', 'pshufb', 'pshufd', 'pshufhw',
    'pshuflw', 'pshufw', 'pslld', 'pslldq',
    'psllq', 'psllw', 'psrad', 'psraw', 'psrld', 'psrldq',
    'psrlq', 'psrlw', 'psubb', 'psubd', 'psubq', 'psubsb',
    'psubsw', 'psubusb', 'psubusw', 'psubw', 'pswapd', 'pxor',
    'pvarg',
    'rol', 'ror', 'rsqrtps', 'rsqrtss',
    'rclsid', 'rdseed', 'roundsd',
    'sal', 'sar', 'sbb', 'setalc', 'setb', 'setbe', 'setl', 'setle',
    'setnb', 'setnbe', 'setnl', 'setnle', 'setno', 'setnp',
    'setns', 'setnz', 'seto', 'setp', 'sets', 'setz',
    'shl', 'shld', 'shr', 'shrd', 'shufpd', 'shufps',
    'sqrtps', 'sqrtsd', 'sqrtss', 'stc', 'std', 'sti',
    'sub', 'subpd', 'subps', 'subsd', 'subss',
    'sqrtpd',
    'vaddps', 'vaddsd', 'vaddss', 'vaddsubpd', 'vandnpd',
    'vdivpd', 'vdivps', 'vdivsd', 'vdivss', 'vhsubpd',
    'vhsubps', 'vmaxpd', 'vmaxsd', 'vmaxss', 'vminsd',
    'vminss', 'vmulps', 'vmulss', 'vpackssdw', 'vpacksswb',
    'vpackuswb', 'vpaddb', 'vpaddd', 'vpaddq',
    'vpaddsb', 'vpaddsw', 'vpaddusb', 'vpaddusw',
    'vpaddw', 'vpandn', 'vpclmulqdq', 'vpermilps', 'vpermq',
    'vpextrw', 'vpinsrw', 'vpmaddwd', 'vpmaxub', 'vpmulhuw',
    'vpmulhw', 'vpmullw', 'vpsadbw', 'vpshufhw', 'vpshuflw',
    'vpsllq', 'vpsllw', 'vpsrad', 'vpsrld', 'vpsrlq',
    'vpsrlw', 'vpsubb', 'vpsubd', 'vpsubusb', 'vpxor',
    'vrcpss', 'vrsqrtss', 'vshufpd', 'vshufps', 'vsqrtpd',
    'vsqrtps', 'vsqrtsd', 'vsubpd', 'vsubps', 'vsubsd',
    'vxorps', 'vzeroupper',
    'vaddpd', 'vaddsubps', 'vandnps', 'vandpd', 'vmaxps', 'vminpd',
    'vmulpd', 'vmulsd', 'vorps', 'vpavgw',
    'vpmaxuw', 'vpminsw', 'vpmuludq', 'vpshufd',
    'vpslld', 'vpsubsb', 'vpsubusw', 'vpsubw', 'vrcpps', 'vrsqrtps',
    'xadd', 'xbegin', 'xchg', 'xor', 'xorpd', 'xorps',
]

CmpInstList = [
    'cmp', 'cmpeqps', 'cmpeqsd', 'cmpeqss', 'cmpleps',
    'cmplesd', 'cmpltpd', 'cmpltps', 'cmpltsd', 'cmpneqpd',
    'cmpneqps', 'cmpnlepd', 'cmpnlesd', 'cmpps', 'cmps',
    'cmpsb', 'cmpsd', 'cmpsw', 'cmpxchg', 'comisd',
    'comiss',
    'cmpeqpd', 'cmpltss', 'cmpnleps', 'cmpnless',
    'cmpnltpd', 'cmpnltps', 'cmpnltsd', 'cmpnltss',
    'cmpunordpd', 'cmpunordps',
    'fcom', 'fcomi', 'fcomip', 'fcomp', 'fcompp', 'ficom', 'ficomp',
    'fucom', 'fucomi', 'fucomip', 'fucomp', 'fucompp',
    'pcmpeqb', 'pcmpeqd', 'pcmpeqw', 'pcmpgtb',
    'pcmpgtd', 'pcmpgtw', 'pfcmpeq', 'pfcmpge', 'pfcmpgt',
    'ucomisd', 'ucomiss',
    'vpcmpeqb', 'vpcmpeqd',
    'vpcmpeqw', 'vpcmpgtb', 'vpcmpgtd', 'vpcmpgtw', 'vucomiss',
    'vcmpsd', 'vcomiss', 'vucomisd',
]

MovInstList = [
    'cmova', 'cmovb', 'cmovbe', 'cmovg', 'cmovge',
    'cmovl', 'cmovle', 'cmovnb', 'cmovno', 'cmovnp',
    'cmovns', 'cmovnz', 'cmovo', 'cmovp', 'cmovs', 'cmovz',
    'fcmovb', 'fcmovbe', 'fcmove', 'fcmovnb',
    'fcmovnbe', 'fcmovne', 'fcmovnu', 'fcmovu',
    'mov', 'movapd', 'movaps', 'movd', 'movdqa', 'movdqu',
    'movhlps', 'movhpd', 'movhps', 'movlhps', 'movlpd',
    'movlps', 'movmskpd', 'movmskps', 'movntdq', 'movnti',
    'movntps', 'movntq', 'movq', 'movs', 'movsb', 'movsd',
    'movss', 'movsw', 'movsx', 'movups', 'movzx',
    'movntpd', 'movupd',
    'pmovmskb', 'pmovzxbd', 'pmovzxwd',
    'vmovapd', 'vmovaps', 'vmovd',
    'vmovddup', 'vmovdqa', 'vmovdqu', 'vmovhps', 'vmovlhps',
    'vmovntdq', 'vmovntpd', 'vmovntps', 'vmovntsd',
    'vmovsd', 'vmovsldup', 'vmovss', 'vmovupd', 'vmovups',
    'vmovhlps', 'vmovlps', 'vmovq', 'vmovshdup',
]